package com.cskaoyan.javase.io._1byte._2filein;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

/**
 * 文件操作相关的字节输入流,可以将文件中数据读取进内存(Java程序)
 * 使用文件字节输入流的步骤是:
 *      1.创建文件字节输入流对象
 *      2.read方法读取数据
 *      3.close关闭流资源
 *
 * @since 16:05
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws IOException {
        // 1.创建文件字节输入流对象


        // FileInputStream(String fileName)	通过打开一个到实际文件的连接来创建一个FileInputStream，该文件通过文件系统中的路径名name指定。
        FileInputStream in = new FileInputStream("a.txt");

        // 2.read方法读取数据
        // abstract  read()	  int 从输入流中读取数据的下一个字节的数据。返回值就是这个数据的字节值。
        // 从输入流中读取的一个字节数据，一个字节的数据最多占据8位，在读取到数据的前提下返回值必定是一个[0,255]范围内的正整数。而如果到达了流的末尾，已没有数据继续读取了，该方法会返回-1表示已读取完毕数据了。
        // 单字节读取文件中的字节数据,一个字节一个字节的读取
        // readSingle(in);

        // read(byte[] b)	int	从输入流中读取b.length个的字节数据，并将其存储在数组b中，注意是从数组的头开始进行存储。返回值是实际读取的字节数量。如果读取到流的末尾,没有数据可读了,返回-1
        // readMulti(in);


        // read(byte[] b,  int off, int len)	int	从输入流中读取len个字节数据，然后从下标off开始存入b数组。返回值是实际读取的字节数量。
        byte[] buf = new byte[10];
        int readCount = in.read(buf, 5, 1);
        System.out.println(readCount);
        System.out.println(Arrays.toString(buf));

        // 3.close关闭流资源
        in.close();
    }

    private static void readMulti(FileInputStream in) throws IOException {
        byte[] buf = new byte[4];
        int readCount = in.read(buf);
        System.out.println(readCount);
        System.out.println(Arrays.toString(buf));
        // String的构造器 String(byte[])
        System.out.println(new String(buf));
    }

    private static void readSingle(FileInputStream in) throws IOException {
        int readByteNum;
        readByteNum = in.read();
        System.out.println(readByteNum);
        readByteNum = in.read();
        System.out.println(readByteNum);
        readByteNum = in.read();
        System.out.println(readByteNum);
        readByteNum = in.read();
        System.out.println(readByteNum);
        readByteNum = in.read();
        readSingle(readByteNum);
    }

    private static void readSingle(int readByteNum) {
        System.out.println(readByteNum);
    }
}
